perm filename PLAY.FAI[IRC,LCS] blob
sn#247966 filedate 1977-03-30 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00002 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 TITLE SOUND DOROTHY BENDER MEMORIAL TITLE 1969,69,69, 1975(LCS)*******
C00017 ENDMK
C⊗;
TITLE SOUND; DOROTHY BENDER MEMORIAL TITLE 1969,69,69, 1975(LCS)*******
; ROUTINE TO READ THE OUTPUT FROM THE MUSIC
; PROGRAM AND CALL THE D-A CONVERTER TO PLAY.
;
; NAME OF THE FILE TO BE INPUTTED IS 'TEST.SND',
; THE FIRST RECORD OF WHICH CONTAINS THE
; NUMBER OF WORDS OF DATA IN THE ENTIRE DISK FILE.
EXTERNAL JOBREL
A ← 1 ;WORK
B ← 2 ;WORK
RET ← 3 ;RETURN ACCUMULATOR
T1 ← 4 ; TEMP FOR ADSMAP (JAM)
BUFCNT ← 5 ;USED IN REPLAY FEATURE TO KEEP TRACK OF BUFFER NUM.
REP ← 6; ;FOR REPLAY USETI
;****P ← 17
;;BUFSIZ ←=20224 ;****** DOUBLE THIS FOR 4-CHANNEL SOUND!!!!!
BUFSIZ ←4400*5 ;OPTIMIZED FOR 3330 DSK. (←4400*3 IN SYS VERSION)
↓DSKCHN ←1 ;DISK CHANNEL FOR INPUT
↓ADCHN ←2 ;D-A CHANNEL FOR OUTPUT
;****PDL: BLOCK 10
OPDEF READCH [51B8]
OPDEF MESSAGE[51B8!3B12]
BEG: CALLI 0,0 ;RESET I/O DEVICES
OPEN DSKCHN,[17 ;MODE
'DSK ' ;DEVICE NAME
0] ;NO BUFFER HEADERS
HALT BEG ;RESTART IF DEVICE IS UNAVAILABLE
MOVE 6,['TEST ']
MOVE 7,['SND ']
SETZM DIR2+3 ;FOR RESTART
SETZM DIR+3 ;FOR RESTART
OUTSTR[ASCIZ/FILE NAME -- /]
SETZM DIR+1
SETZM DIR
SETO 5, ;FLAG FOR EXTENSIONS
MOVE 2,[POINT 6,DIR]
MOVEI "1" ;INIT SAVSPD
MOVEM SAVSPD#
SETZM XGHLD ;FLAG FOR XGHOLD SET TO 0
JRST GOT
EXT: MOVE 2,[POINT 6,DIR+1]
SETZ 5,
GOT: INCHWL 1
CAIN 1,15 ; A CR?
JRST GOT
CAIGE 1,60 ; CHECKS FOR GOOD CHARS.
JRST LX
SUBI 1,40
IDPB 1,2
JRST GOT
LX: JUMPE 5,LZ
SKIPN DIR
MOVEM 6,DIR
CAIN 1,56 ; 56='.'
JRST EXT
JRST MESS
LZ: SKIPN DIR+1
MOVEM 7,DIR+1
MESS: MESSAGE [ASCIZ/
SPEED←1: TYPE <S> TO CHANGE IT. BYTE←12: TYPE <B> TO CHANGE IT.
NCHNS←1: TYPE <N> TO CHANGE IT. TYPE <Rn> TO REPEAT n TIMES. /]
SETZM REP ; FOR SPEED CHNGS WITH HEADER
MOVEI A,1
DPB A,[POINT 2,DACPAR,35]
JRST SPD
;****BYTCH: PUSHJ P,CR
BYTCH: MESSAGE [ASCIZ/ITS
0=12 BITS, 1=18 BITS. /]
READCH A
CAIN A,15 ; A CR?
JRST LF ; GET THE LF
CAIE A,61 ;61 IS CHAR. 1 1=18, ANYTHING ELSE=0
JRST .+3
MOVEI A,1
JRST BITS
SETZ A,
BITS: DPB A,[POINT 2,DACPAR,29] ;12 OR 18 BIT
;**** JRST SPX
JRST SPD
;****NCHNS: PUSHJ P,CR
NCHNS: MESSAGE [ASCIZ/CHNS
HOW MANY CHANNELS? /]
READCH A ;FIND OUT NUMBER OF CHANNELS AND THE SPEED.
CAIN A,15 ; A CR?
JRST LF ; GET THE LF
SUBI A,"0" ;CONVERT TO BINR
DPB A,[POINT 2,DACPAR,35]
;**** JRST SPX
JRST SPD
;****SPEED: PUSHJ P,CR
SPEED: MESSAGE [ASCIZ/PEED
0=6.4K 1=12.8 2=25.6 3=51.2 4=102.8 5=204.8 /]
READCH A
CAIN A,15 ; A CR?
JRST LF ; GET THE LF
CAILE A,"5" ;IS IT 1 - 5?
JRST SPEED ; BAD SPEED, TRY AGAIN.
SPD3: DPB A,[POINT 3,DACPAR,26] ;PUT AWAY THE SPEED
;**** JRST SPX
JRST SPD
LF: READCH A ;GET THE LF
JRST SPD ;IGNORE IT AL
;****CR: CAIN A,12 ;IS IT A LF ALREADY?
;**** POPJ P, ; GO BACK THEN.
;**** READCH B
;**** CAIE B,15 ; A CR?
;**** JRST CR ; NO, GOBBLE ANOTHER CHAR.
;**** READCH B ; GET THE LF
;**** POPJ P,
XGHOLD: SETOM XGHLD# ;SET XGHOLD FLAG TO -1
MESSAGE [ASCIZ/ WILL HOLD XGP & DAC/]
;****SPX: PUSHJ P,CR ;GO GET CRLF
SPD: MESSAGE [ASCIZ/
PLAY? /]
SETOM REPT# ;FOR MULTIPLE PLAYS WITH Rn
READCH A
CAIN A,"N"
JRST NCHNS ;N=NCHNS, B=BYTE, S=SPEED, R=REPEAT
CAIN A,"B"
JRST BYTCH
CAIN A,"+" ;TYPE + TO HOLD ON TO XGP
JRST XGHOLD
CAIE A,"-" ; - LETS LOOSE
JRST .+5
RELEASE ADCHN,
;;; RELEASE 16,
MESSAGE [ASCIZ/ XGP & DAC RELEASED /]
SETZM XGHLD
;**** JRST SPX
JRST SPD
CAIN A,"S"
JRST SPEED
CAIN A,15 ; IS IT A CRLF???
;**** JRST PLLF ; YES, GO TO 'GO'.
JRST PLA2
CAIE A,"R" ;TYPE Rn TO REPEAT n TIMES, NO PAUSE
JRST PLA2 ;ELSE GO PLAY SAME AS LAST TIME
REP3: MESSAGE [ASCIZ/EPEAT /]
READCH A ;GET NUM FOLLOWING R.
SUBI A,"0" ;MAKE BIN.
CAILE A,=9 ;IF(A.GT.9)A=1 TRAPS "G" ETC.
MOVEI A,1
MOVNM A,REPT ;REPEATS UP TO 9 TIMES.
MOVE A,SAVSPD ;GET BACK SPEED.
JRST PLA2
;****PLLF: READCH A ;GET THE LF.
;**** JRST PLA2+1
SPD2: MOVEM A,SAVSPD# ;SAVE AC A.
;****PLA2: PUSHJ P,CR
PLA2: SETZM DIR+3
SETZM DIR2+3
MOVE 5,SND ;GET 'SND '
LOOKUP DSKCHN,DIR
SKIPA ;CAN'T FIND TEST.SND
JRST XOPEN ;FOUND IT
CAMN 5,DIR+1 ;IS DIR+1='SND '?
JRST MUS ;YES, GO LOOK FOR MUSIC.MUS
MOVEM 5,DIR+1
JRST PLA2+1
MUS: LOOKUP DSKCHN,DIR2 ;TRY FOR MUSIC.MUS
JRST [MESSAGE[ASCIZ/
*** MUSIC FILE NOT FOUND/]
CALLI 12]
;EXIT IF FILE IS MISSING
;; MOVE A,DIR2+3 ;GET LENGTH OF FILE
;; MOVEM A,DIR+3;PUT IT IN RIGHT PLACE
XOPEN: OPEN ADCHN,[1B27+117 ;MODE
'DAC ' ;DEVICE NAME
0] ;NO BUFFER HEADERS
SKIPA
;;; JRST XGPOK-1 ;WE GOT THE DAC, NOW TRY FOR THE XGP!
JRST SPWAR-1 ;GO AHEAD
MESSAGE [ASCIZ/
WAITING FOR DAC------ /]
OPEN ADCHN,[1B26+117 ;WE'LL WAIT FOR IT
'DAC '
0]
0 ;NO FAILURE POSSIBLE?????
MTAPE ADCHN,DACPAR
;;;XGPOK: OPEN 16,[1B27 ;DOWN TO SPWAR FOR XGP CONFLICT.
;;; 'XGP ' ;DEVICE NAME
;;; 0]
;;; SKIPA
;;; JRST SPWAR; ;WE GOT THE XGP
;;; MOVSI A,'XGP' ;IS THE XGP INITTED OR ASSIGNED?
;;; DEVUSE A,
;;; TLNN A,77 ;OR IS IT JUST DETACHED?
;;; TLNN A,400000 ; IS IT INITTED?
;;; JRST WAIT
;;; JRST SPWAR ;IT'S DETACHED, SO GO AHEAD AND PLAY.
;;;WAIT: MESSAGE [ASCIZ/
;;;WAITING FOR XGP------ /]
;;; OPEN 16,[1B26
;;; 'XGP '
;;; 0]
;;; 0 ;IT HAD BETTER NOT FAIL.
SPWAR: HRRZ A,JOBREL
HRRZM A,OLDREL#
HRRZM A,BUF1
HRRZI A,1(A)
HRRM A,HEADER
ADDI A,BUFSIZ
HRRZM A,BUF2
ADDI A,BUFSIZ+1
HRRZM A,BUF3
ADDI A,BUFSIZ+2
CORE A,
JRST [OUTSTR[ASCIZ/
CAN'T GET CORE!
/]↔ JRA 16,2(16)]
LOCK A, ;SPWAR:
MESSAGE [ASCIZ/ GO? /]
;**** PUSHJ P,CR
READCH A
CAIN A,15
READCH A ;FOR CRLF
; READS TO FIND (AND IGNORE) HEADER.(1ST REC.)
DOIT: SETO BUFCNT, ;KEEP TRACK OF WHICH BUFFER, FOR REPLAY
SKIPE REP ;SKIP FIRST TIME
JRST REPLA ;OMIT HEADER ON REPLAYS
MOVEI REP,1 ;FOR REPLAY
INPUT DSKCHN,HEADER
HRRZ A,HEADER
HRRZ B,1(A)
CAIE B,525252 ; LOOKS FOR MAGIC NUMBER.
JRST REPLA
MESSAGE [ASCIZ/
---- THERE'S A HEADER ---- /]
HLRZ B,2(A) ;GET SPEED FROM LEFT HALF OF WD 2
DPB B,[POINT 3,DACPAR,26] ;PUT AWAY THE SPEED
HRRZ B,3(A) ;GET BITS FROM RIGHT HALF OF WD 3
DPB B,[POINT 2,DACPAR,29] ;12 OR 18 BIT
MOVE B,4(A) ;GET NCHNS FROM WD 4
DPB B,[POINT 2,DACPAR,35]
MTAPE ADCHN,DACPAR ;NOW USE ALL THE STUFF FROM THE HEADER
MOVEI REP,2 ;FOR REPLAY
SKIPA
REPLA: USETI DSKCHN,(REP) ;REP=1 IF NO HEADER, =2 WITH HEADER.
LNTH: movs a,DIR+3 ;get length of file.
CAIN REP,2 ;WAS THERE A HEADER?
ADDI A,200 ;YES, SUBTRACT IT FROM WDCNT.
movnm a,nwd
;-----------------------------------------------------
;BEGIN MAIN BODY OF PROGRAM
MOVE T1,[647003,,0]
ADSMAP T1, ; SET AUDIO SWITCH TEMPORARILY TO DAC (JAM 7/24/75)
; THE OPTIONS WE ASKED FOR ARE TEMPORARY, WAIT FOR
; PAGE TO FINISH, DON'T INTERRUPT WITH MORE PAGES,
; DELAY BEEPS TO END OF XFR.
OUTSTR [ASCIZ /
TO DAC . . ./]
JUMPE BUFCNT,LOOP2
JUMPG BUFCNT,LOOP3 ;TO START ON CORRECT BUFFER WHEN REPLAYING
LOOP: JSP RET,SUB ;ROUTINE TO READ AND WRITE
BUF1: 0 ;USE BUF1 FOR THE I/O
AOS BUFCNT
JUMPLE B,DONE ;DONE
LOOP2: JSP RET,SUB
BUF2: 0
AOS BUFCNT
JUMPLE B,DONE
LOOP3: JSP RET,SUB ;CALL IT AGAIN
BUF3: 0 ;USE BUF3 FOR THE I/O
SETO BUFCNT, ; RE-INIT BUFFER COUNTER, FOR REPLAY
JUMPG B,LOOP ;GO BACK FOR MORE IF B>0
DONE: AOSGE REPT ;UPDATE REPT
JRST REPLA ;WE PLAY AGAIN IF REPT .LT.0
close dskchn, ;END OF PROGRAM.
SKIPL XGHLD ;FOR GREED'S SAKE
releas adchn,
OUTSTR [ASCIZ / DONE!
/]
SETO T1,
ADSMAP T1, ; RESET AUDIO SWITCH CONNECTION TO PERMANENT (JAM 7/24/75)
;; SPCWAR 0,'SSW'
UNLOCK
;;; SKIPL XGHLD ;FOR GREED'S SAKE
;;; RELEASE 16,
HRRZ A,OLDREL
CORE A,
0 ;DON'T THINK OF FAILURE
jrst SPD
;SUBROUTINE TO SET UP IOWD AND READ AND WRITE.
; 1(RET) WILL BE THE RETURN
; 0(RET) WILL BE THE ADDRESS OF THE BUFFER TO BE
; PUT IN THE RIGHT HALF OF THE IOWD.
; A WILL BE A WORK REGISTER
; B WILL BE TESTED ON THE OUTSIDE.
SUB: MOVNI A,BUFSIZ ;PICK UP AND COMPLEMENT BUFSIZ
ADDB A,NWD ;A←NWD-BUFSIZ
;NWD←NWD-BUFSIZ
MOVE B,A ;SAVE B TO BE TESTED FOR LAST
;TIME.
JUMPL A,LAST ;SET UP FOR LAST TIME.
MOVEI A,0
;THE IOWD LOOKS LIKE:
; [-BUFSIZ / BUFI-1]
LAST: ADDI A,BUFSIZ
MOVNS A ;COMPLEMENT A
HRL A,0(RET) ;PICK UP BUFI AND MOVE IT
;TO THE LEFT SIDE OF A.
MOVSM A,INLIST ;SWAP A AND MOVE IT.
MOVSM A,OUTWC ;SAME FOR OUTPUT.
INPUT DSKCHN,INLIST ;READ A RECORD.
OUTPUT ADCHN,OUTWC ;WRITE THE RECORD.
JRST 1(RET) ;RETURN
;---------------------------------------------------------
; STORAGE:
NWD: 0 ;FOR NUMBER OF WORDS OF INPUT.
;;↓BUF1: BLOCK BUFSIZ+1 ;BUFFER 1
;;BUF2: BLOCK BUFSIZ+1 ;BUFFER 2
;;BUF3: BLOCK BUFSIZ+1 ;BUFFER 3
SND: 'SND '
DIR2: 'TEST ' ;FILENAME FOR INPUT
'SND ' ;EXTENSION
0 ;INFORMATION ON FILE
0 ;PROJECT PROG#
DIR: 0 ;NAME
0 ;EXTENSION
0 ;INFORMATION ON FILE
0 ;PROJECT PROG#
CLIST: IOWD 1,NWD ;FOR THE FIRST RECORD
0
INLIST: 0 ;WILL CONTAIN AN IOWD
0
HEADER: IOWD =128,BUF1
0
OUTWC: 0 ;WILL CONTAIN AN IOWD FOR D-A
;; 3650 ;MAGIC BITS FOR 136.
OUTBIT: 4000 ;BITS FOR D-A
BLOCK 2
DACPAR: 1001 ;SPEED 0=6.4K, 1=12.8, 2=25.6, 3=51.2, 4=102.4, 5=
0
0
A←1
B←2
D←3
ichn←adchn
END BEG